#include <stdio.h>

int main()
{
    // 如果一种数据类型的取值只有少数几种可能，并且每种取值都有自己的含义，为了提高代码的可读性，可以将它们定义为 Enum 类型，中文名为枚举。

    enum colors
    {
        RED,
        GREEN,
        BLUE
    };

    printf("%d\n", RED);   // 0
    printf("%d\n", GREEN); // 1
    printf("%d\n", BLUE);  // 2

    enum colors color;

    color = RED;
    printf("%d\n", color);

    typedef enum
    {
        SHEEP,
        WHEAT,
        WOOD,
        BRICK,
        ORE
    } RESOURCE;

    RESOURCE r;

    // 还有一种不常见的写法，就是声明 Enum 类型时，在同一行里面为变量赋值
    {
        enum
        {
            SHEEP,
            WHEAT,
            WOOD,
            BRICK,
            ORE
        } r2 = BRICK,
          s2 = WOOD;
    }

    // 由于 Enum 的属性会自动声明为常量，所以有时候使用 Enum 的目的，不是为了自定义一种数据类型，而是为了声明一组常量。这时就可以使用下面这种写法，比较简单。

    enum
    {
        ONE,
        TWO
    };

    printf("%d %d\n", ONE, TWO); // 0 1

    // C 语言也允许为 ENUM 常量指定值，不过只能指定为整数，不能是其他类型。
    {
        enum
        {
            ONE = 1,
            TWO = 2
        };
        printf("%d %d\n", ONE, TWO); // 1 2
    }

    // Enum 常量可以是不连续的值。
    {
        enum
        {
            X = 2,
            Y = 18,
            Z = -2
        };
    }

    // Enum 常量也可以是同一个值。
    {
        enum
        {
            X = 2,
            Y = 2,
            Z = 2
        };
    }

    // 如果一组常量之中，有些指定了值，有些没有指定。那么，没有指定值的常量会从上一个指定了值的常量，开始自动递增赋值。
    enum
    {
        A,     // 0
        B,     // 1
        C = 4, // 4
        D,     // 5
        E,     // 6
        F = 3, // 3
        G,     // 4
        H      // 5
    };
    return 0;
}